package it.luigiarpino.kernighanLin;

/**
 * Calcola il partizionamento a costo minimo di un 
 * grafo con un numero generico di nodi.
 * Gestisce i limiti di banda e di capacità.
 * Implementa la tecnica dell'expansion factor per
 * il calcolo della partizione a costo minimo.
 * 
 * @author Luigi Lorenzo Arpino [luigiarpino@yahoo.it]
 *
 */
public class LinKernighanAmmissibileEF 
{
	
	private int[] partizionamento;
	private int costo;
	private int costoMaxTaglio;
	private int numMaxNodiPerPartizione;
	
	/**
	 * 
	 * @param matrix
	 * @param numeroPartizioni numero di partizioni che compongono il grafo
	 * @param taglioMax il valore del taglio massimo
	 * @param maxNodi il numero massimo di nodi che possono far parte della stessa partizione
	 * @throws LinKernighanException 
	 */
	public LinKernighanAmmissibileEF(int[][]matrice,  int taglioMax, int maxNodi) throws LinKernighanException
	{
		boolean isFisrtCycle=true;
		this.costo =0;
		for(int nodi=1; nodi<=maxNodi; nodi++)
		{
			LinKernighanAmmissibile lk=new LinKernighanAmmissibile(matrice,taglioMax,nodi);
			int costoAttuale=lk.getCosto();
			if (isFisrtCycle || (costoAttuale <= costo) )
			{
				isFisrtCycle=false;
				this.costo=costoAttuale;
				this.partizionamento=lk.getPartizionamento();
				this.costoMaxTaglio=lk.getCostoMaxTaglio();
				this.numMaxNodiPerPartizione=lk.getNumMaxNodiPerPartizione();
			}
		}
	}
	
	public int getCosto() 
	{
		return costo;
	}

	public int getCostoMaxTaglio()
	{
		return this.costoMaxTaglio;
	}
	
	public int[] getPartizionamento() 
	{
		return partizionamento;
	}
	
	public int getNumMaxNodiPerPartizione()
	{
		return this.numMaxNodiPerPartizione;
	}
	
	public static void main(String[] args) throws LinKernighanException
	{
		int[][] matrix={
			    //   0  1  2  3  4  5 
					{0, 2, 0, 0, 0, 0},//0 
					{2, 0, 1, 0, 0, 0},//1
					{0, 1, 0, 2, 1, 0},//2
					{0, 0, 2, 0, 0, 0},//3
					{0, 0, 1, 0, 0, 2},//4
					{0, 0, 0, 0, 2, 0},//5
			};
		int taglioMax=100;
		int maxNodi=3;
		LinKernighanAmmissibileEF lk=new LinKernighanAmmissibileEF(matrix,  taglioMax, maxNodi);
		int costo=lk.getCosto();
		int[] partizionamento = lk.getPartizionamento();
		System.out.println();
		System.out.println("Costo="+costo);
		System.out.println();
		for(int i=0; i< partizionamento.length ; i++)
	    {
			System.out.print(" "+partizionamento[i]);
	    }
	}
}
